export { };
// 函数类型
//1. 没有返回值的函数： void ，表示空
/* function sum(a: number, b: number): void {
  let sum = a + b;
  console.log('sum=', sum)
}
sum(10, 20) */

// 2. 有返回值：
function sum(a: number, b: number): number {
  let sum = a + b;
  return sum;
}
sum(10, 20)

// 3. 有参数的函数， 和参数可选, 必须放在最后面

function ajax(url: string, data: object, success: Function, type?: string, async?: boolean): void {
  console.log(url);
  console.log(data);
  console.log(success);
  console.log(type);
  console.log(async);
}
// ajax("/login", { password: 123 }, () => { })

// 4. 给参数一个默认值：与普通可选参数不同的是，带默认值的参数不需要放在必须参数的后面。

/* function ajax2(
  url: string,
  data: object,
  success: Function,
  type: string = 'get',
  async: boolean = true
): void {
  console.log(url);
  console.log(data);
  console.log(success);
  console.log(type);
  console.log(async);
}

ajax2("/login", { password: 123 }, () => { }) */

// 如果放在前面，它就是必须要传入的参数。
function ajax2(
  type: string = 'get',
  async: boolean = true,
  url: string,
  data: object,
  success: Function,

): void {
  console.log(type);
  console.log(async);
  console.log(url);
  console.log(data);
  console.log(success);

}
// 当你传一个undefined给有默认值的参数，表示使用默认的值。
// ajax2(undefined, undefined, "/login", { password: 123 }, () => { })

// 传入一个具体值时，就会替换默认的值
// ajax2("post", undefined, "/login", { password: 123 }, () => { })

// 5. 使用数组的解构来处理任意个参数：
// let age: number[] = [23, 23, 4, 56, 67, 34];

// ...arr, 表示把除参数a,b以外的剩余参数，都以数组形式给arr.
function fn1(a: number, b: number = 10, ...arr: number[]): void {
  console.log(a); //23
  console.log(b); // 23 ,
  console.log(arr); //  4, 56, 67, 34
}

fn1(23, 23, 4, 56, 67, 34)

// 6. 函数表达式

// (a: number, b: number) => number, 表示一个有两个number类型的参数，并换回一个number结果的函数类型，都写成箭头函数的格式。
const fn2: (a: number, b: number) => number = function (a: number, b: number): number {
  return a + b;
}

fn2(1, 2)

// 7. 高级函数的定义：
// 所谓高阶函数： 一个函数的参数是一个函数类型，返回一个新的函数，这种函数叫高阶函数。
// 柯里化是指这样一个函数(假设叫做createCurry)，他接收函数A作为参数，运行后能够返回一个新的函数。并且这个新的函数能够处理函数A的剩余参数。

// Array.forEach(()=>{})
// params1参数，是一个由任意个参数的函数，并且没有返回值。
function fn3(params1: (...arr: number[]) => void): () => void {
  console.log("fn3被调用了");

  // 变量作用域
  let x: number = 1, y: number = 2, z: number = 3;
  return function () {
    params1(x, y, z);
    console.log('返回一个新函数');
  }
}

const newFn = fn3((a, b, c) => {
  let sum = a + b + c;
  console.log(sum);
})

newFn()
